package controlers
{
    import events.SillajConnectionEvent;
    
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.events.TimerEvent;
    import flash.filters.DropShadowFilter;
    import flash.utils.Timer;
    
    import mx.core.Application;
    import mx.events.FlexEvent;
    
    import utils.Notifieur;
    
    public class ApplicationController
    {
        
        private var view:main ;
        
        /*utilisé pour faire disparaitre le bouton close quelques secondes après avoir quitté l'application
        sans ça, le bouton clignote lorsqu'on survol les combobox et je ne vois pas pourquoi*/
        private var timerMouseOut:Timer ;
        
        public function ApplicationController( view:main )
        {
            this.view = view ;
            addListeners( ) ;
            
            //ajout d'une ombre portée sur les 2 faces
            var dropShadow:DropShadowFilter = new DropShadowFilter( 3, 90, 0x222222, 0.7, 4, 4 ) ;
            view.frontView.filters = [ dropShadow ] ;
            view.optionView.filters = [ dropShadow ] ;
            
            //on masque le bouton de fermeture de l'appli
            view.btClose.visible = false ;
            
            //on redimensionne le stage pour capturer correctement le mouseOver et mouseOut
            //le +5 c'est pour le dropShadow
            /*
            view.stage.stageWidth  = view.viewstack.width + view.viewstack.x + 5 ;
            view.stage.stageHeight = view.viewstack.height + view.viewstack.y + 5 ;
            */
            resizeApplication( ) ;      
            
            timerMouseOut = new Timer( 500, 1 ) ;  
            timerMouseOut.addEventListener( TimerEvent.TIMER_COMPLETE, timerMouseOut_completeHandler ) ;
        }
        
        private function addListeners( ):void
        {
            Notifieur.getInstance().addEventListener( SillajConnectionEvent.LOGIN_SUCCESS, optionView_loggedHandler ) ;
            Notifieur.getInstance().addEventListener( "showOption", showOption_handler ) ;
            Notifieur.getInstance().addEventListener( "showFront", optionView_loggedHandler ) ;
            
            //gestion du deplacement de la fenetre
            view.frontView.addEventListener( "startDrag", view_startDragHandler ) ;  
            view.optionView.addEventListener( "startDrag", view_startDragHandler ) ;
            
            //fermeture de l'application
            view.stage.addEventListener( MouseEvent.MOUSE_OVER, view_mouseOverHandler ) ;
            view.stage.addEventListener( MouseEvent.MOUSE_OUT, view_mouseOutHandler ) ;
            view.btClose.addEventListener( MouseEvent.CLICK, btClose_clickHandler ) ;
            
            Notifieur.getInstance().addEventListener( "changeState", frontView_changeStateHandler ) ;
        }
        
        
        /**
        * les options de connexion à sillaj ont été validée on prévient la vue Front et on l'affiche
        */ 
        private function optionView_loggedHandler( e:Event ):void
        {
            view.viewstack.selectedChild = view.frontView ;
            resizeApplication() ;
            //TODO régler la hauteur lors du changement de vue de la frontView 
            //TODO ajouter champs de saisie avec marqué commentaire (textFieldAdvanced)
        }
        
        
        /**
        * fonction qui va redimensionner l'application pour que le composant soit visible
        * tout en ne dépassant pas pour que le mouseOut qui masque la croix de fermeture
        * fonctionne correctement
        */ 
        private function resizeApplication( ):void
        {
            Application.application.height = view.viewstack.selectedChild.height + view.viewstack.y ;  
            view.stage.stageHeight            = view.viewstack.selectedChild.height + view.viewstack.y ;
            
            Application.application.width   = view.viewstack.selectedChild.width + view.viewstack.x ;
            view.stage.stageWidth              = view.viewstack.selectedChild.width + view.viewstack.x  ;
        }
        

        /**
        * flip de window
        */ 
        private function flip(  ):void
        {
           //1 - augmenter la taille du stage pour ne pas tronquer les coins
           // ! voir ce que ça va faire si on se trouve au bord de la fenêtre
           
           //2 - flip sur l'axe Y (rotationY) avec la classe TweenLite > jusqu'à la tranche
           
           //3 -  arrivé à la tranche on affiche l'autre vue que celle actuellement affichée
           
           //4 - fin du flip
           
           //5 - on remet le stage à la bonne taille
        }



        /**
        * affiche le panneau des options
        */ 
        private function showOption_handler( e:Event ):void
        {
            view.viewstack.selectedChild = view.optionView ;
            resizeApplication( ) ;
        }
        

        /**
        * deplace la fenetre
        */ 
        private function view_startDragHandler( e:Event ):void
        {
            view.stage.nativeWindow.startMove();
        }
        
        
        /**
        * survole de l'application
        */
        private function view_mouseOverHandler( e:MouseEvent ):void
        {
            view.btClose.visible = true ;
            timerMouseOut.stop( ) ;
            timerMouseOut.reset( ) ;
        } 
        
        /**
        * la souris n'est plus au dessus de l'appli
        */
        private function view_mouseOutHandler( e:MouseEvent ):void
        {
            timerMouseOut.start( ) ;
        } 
        
        /**
        * fin du timer, on masque le bouton close si la souris n'est pas sur l'application
        */
        private function timerMouseOut_completeHandler( e:TimerEvent ):void
        {
            view.btClose.visible = false ;
        } 
        
        
        /**
        * fermeture de l'application
        */
        private function btClose_clickHandler( e:MouseEvent ):void
        {
            view.stage.nativeWindow.close();
        } 
        
        private function frontView_changeStateHandler( e:Event ):void
        {
            trace( "frontView_changeStateHandler" ) ;
            resizeApplication( ) ;
        }

    }
}